﻿namespace mathD
{
    export class Color
    {
        constructor(r: number = 1, g: number = 1, b: number = 1, a: number = 1)
        {
            this.r = r;
            this.g = g;
            this.b = b;
            this.a = a;
        }
        r: number;
        g: number;
        b: number;
        a: number;
        toString(): string
        {
            return this.r + "," + this.g + "," + this.b + "," + this.a;
        }
        static setWhite(out: Color)
        {
            out.r = 1;
            out.g = 1;
            out.b = 1;
            out.a = 1;
        }
        static setBlack(out: Color)
        {
            out.r = 0;
            out.g = 0;
            out.b = 0;
            out.a = 1;
        }
        static setGray(out: Color)
        {
            out.r = 0.5;
            out.g = 0.5;
            out.b = 0.5;
            out.a = 1;
        }
        
        static multiply(srca: Color, srcb: Color, out: Color)
        {
            out.r = srca.r * srcb.r;
            out.g = srca.g * srcb.g;
            out.b = srca.b * srcb.b;
            out.a = srca.a * srcb.a;
        }

        static scaleToRef(src: Color, scale: number, out: Color)
        {
            out.r = src.r * scale;
            out.g = src.g * scale;
            out.b = src.b * scale;
            out.a = src.a * scale;
        }

        static clone(src: Color, out: Color)
        {
            out.a = src.a;
            out.r = src.r;
            out.g = src.g;
            out.b = src.b;
        }

        static lerp(srca: Color, srcb: Color, t: number, out: Color)
        {
            out.a = t * (srcb.a - srca.a) + srca.a;
            out.r = t * (srcb.r - srca.r) + srca.r;
            out.g = t * (srcb.g - srca.g) + srca.g;
            out.b = t * (srcb.b - srca.b) + srca.b;

            out.a = Math.floor(out.a);
            out.r = Math.floor(out.r);
            out.g = Math.floor(out.g);
            out.b = Math.floor(out.b);
        }
    }
}